#include "cJSON.h"

#include "JSON_app.h"
#include "main.h"
#include <FreeRTOS.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

int free_heap;

void *cjson_freertos_malloc(size_t size)
{
    return pvPortMalloc(size);
}

void cjson_freertos_free(void *ptr)
{
    vPortFree(ptr);
}

void cJSON_APP_Init(void)
{
    static cJSON_Hooks hooks = {0};
    hooks.malloc_fn = cjson_freertos_malloc;
    hooks.free_fn = cjson_freertos_free;
    cJSON_InitHooks(&hooks);
}

char *CreateDeviceJSON(const DeviceData *data)
{
    if (data == NULL) return NULL;

    cJSON *root = cJSON_CreateObject();
    if (root == NULL) return NULL;

    cJSON_AddStringToObject(root, "id", data->id);
    cJSON_AddStringToObject(root, "time", data->time);

    // 创建 power 对象
    cJSON *power_obj = cJSON_CreateObject();
    if (power_obj)
    {
        char power_str[32];
        snprintf(power_str, sizeof(power_str), "%.1f", data->power.W);
        cJSON_AddStringToObject(power_obj, "W", power_str);

        snprintf(power_str, sizeof(power_str), "%.1f", data->power.I);
        cJSON_AddStringToObject(power_obj, "I", power_str);

        snprintf(power_str, sizeof(power_str), "%.1f", data->power.U);
        cJSON_AddStringToObject(power_obj, "U", power_str);

        cJSON_AddItemToObject(root, "power", power_obj);
    }

    // 创建 env 对象
    cJSON *env_obj = cJSON_CreateObject();
    if (env_obj)
    {
        char env_str[32];
        snprintf(env_str, sizeof(env_str), "%.1f", data->env.tem);
        cJSON_AddStringToObject(env_obj, "tem", env_str);

        snprintf(env_str, sizeof(env_str), "%.1f", data->env.hum);
        cJSON_AddStringToObject(env_obj, "hum", env_str);

        snprintf(env_str, sizeof(env_str), "%.1f", data->env.lux);
        cJSON_AddStringToObject(env_obj, "lux", env_str);

        cJSON_AddItemToObject(root, "env", env_obj);
    }

    // 创建 status 对象
    cJSON *status_obj = cJSON_CreateObject();
    if (status_obj)
    {
        if (data->status.door) cJSON_AddStringToObject(status_obj, "door", data->status.door);
        if (data->status.window) cJSON_AddStringToObject(status_obj, "window", data->status.window);
        if (data->status.light) cJSON_AddStringToObject(status_obj, "light", data->status.light);

        cJSON_AddItemToObject(root, "status", status_obj);
    }

    // 生成JSON字符串并清理
    char *json_string = cJSON_PrintUnformatted(root);
    cJSON_Delete(root);
    return json_string;
}
